package projeto.model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
 * 
 *Classe de Recomendação por popularidade
 * @author Jeymisson
 */
public class RecomendaPopularidade implements Recomenda {
	
	
	static RecomendaPopularidade instanciaUnica = null;
	
	/**
	 * Método que recomenda estabelecimentos por popularidade
	 * @param ests Lista de estabelecimentos cadastrados
	 * @param usuarios Lista de usuarios cadastrados
	 * @param user Usuario a receber recomendação
	 * @param qtdRecomendacoes Quantidade de recomendações desejadas
	 * @return Lista com estabelecimentos recomendados
	 */
	public List<Estabelecimento> getRecomendacao(List<Estabelecimento> estabelecimentos, List<Usuario> usuarios,Usuario user, int qtdRecomendacoes){
		
		List<Estabelecimento> Indicados = ordenaPorPopularidade(estabelecimentos, usuarios);
		
		if(qtdRecomendacoes < Indicados.size()){
			return Indicados.subList(0, qtdRecomendacoes);
		}
		return Indicados;	
	}
	
	/**
	 * Padrao singleton instancia unica
	 * @return retorna uma instancia unica de RecomendaEscalar
	 */
	public static RecomendaPopularidade getInstance(){
		if(instanciaUnica == null)
			instanciaUnica = new RecomendaPopularidade();
		return instanciaUnica;
	}
	
	private List<Estabelecimento> calculaPopularidade(List<Estabelecimento> estabelecimentos, List<Usuario> usuarios){
		
		Map<String,Integer> somas = new HashMap<String, Integer>();
		int soma;
		Integer conceito;
		
		for(int i = 0; i < LeituraDeDados.opniaoRestaurantes.size(); i++){
			soma = 0;
			for(Usuario user : usuarios){
				conceito = user.getOpnioes().get(i);
				soma += conceito;
			}
			somas.put(LeituraDeDados.opniaoRestaurantes.get(i), soma);
		}
		
		Iterator<String> est = somas.keySet().iterator();
		
		while(est.hasNext()){
			String estabelecimento = est.next();
			
			for(int i =0; i < estabelecimentos.size(); i++){
				if(estabelecimento.equals(estabelecimentos.get(i).getNome())){
					estabelecimentos.get(i).setPopularidade(somas.get(estabelecimento));
				}
			}
		}
		
		return estabelecimentos;
		
	}
	

	private List<Estabelecimento> ordenaPorPopularidade(List<Estabelecimento> estabelecimentos, List<Usuario> usuarios){
		
		List<Estabelecimento> ordenacaoEstabelecimentos = calculaPopularidade(estabelecimentos,usuarios);
		Map<Integer,List<Estabelecimento>> opnioesOrdenadas = new HashMap<Integer, List<Estabelecimento>>();
		List<Estabelecimento> estabelecimentosOrdenados = new ArrayList<Estabelecimento>();
		
		for(Estabelecimento est: ordenacaoEstabelecimentos){
			if(!(opnioesOrdenadas.containsKey(est.getPopularidade()))){
				List<Estabelecimento> estabelecimento = new ArrayList<Estabelecimento>();
				opnioesOrdenadas.put(est.getPopularidade(),estabelecimento );
				}
			opnioesOrdenadas.get(est.getPopularidade()).add(est);
		}
		
		List<Integer> opnioes = new ArrayList<Integer>(opnioesOrdenadas.keySet());
		Collections.sort(opnioes);
		Collections.reverse(opnioes);
		
		for(int i =0;i<opnioes.size();i++){
			List<Estabelecimento> ordenados = opnioesOrdenadas.get(opnioes.get(i));
			for(Estabelecimento est : ordenados){
				estabelecimentosOrdenados.add(est);
			}
			
		}
		
		return estabelecimentosOrdenados;
	}	
}
